package com.tinet.sistReserva.ejb;

import java.util.ArrayList;

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;

import org.apache.log4j.Logger;

import com.tinet.sistReserva.DAO.UsuarioDao;
import com.tinet.sistReserva.model.Usuario;
import com.tinet.sistReserva.model.util.UsuarioEncontradoException;
import com.tinet.sistReserva.model.util.UsuarioException;
import com.tinet.sistReserva.model.util.UsuarioNoEncontradoException;

/**
 * 
 * Clase que implementa los metodos de la interfaz InterfazUsuarioBean.
 * 
 * @author Frmancil
 */
@Stateless(mappedName = "usuarioBean", name = "usuarioBean")
public class UsuarioBean implements InterfazUsuarioBean {
    /**
     * Logger de clase.
     */
    private static final Logger LOG = Logger.getLogger(UsuarioBean.class);
    /**
     * Manejador de entidad y contexto de persistencia.
     */
    @PersistenceContext(unitName = "sistreserva_bd_fm")
    private EntityManager em;
    /**
     * Instancia de UsuarioDao para llamar a sus metodos.
     */
    private UsuarioDao daoUsuario;

    /**
     * 
     * Instanciador de nuevo Entity Manager para cada acceso a la clase.
     * 
     */
    @PostConstruct
    public void init() {
        daoUsuario = new UsuarioDao(em);
    }

    /**
     * {@inheritDoc}
     */
    public void agregarUsuario(Usuario nuevoUsuario) throws UsuarioException {
        Usuario usuario = buscarUsuarioAgregado(nuevoUsuario);
        if (usuario != null) {
            throw new UsuarioEncontradoException(nuevoUsuario.getUsername());
        } else {
            daoUsuario.agregar(nuevoUsuario);
        }
    }

    /**
     * {@inheritDoc}
     */
    public void eliminarUsuario(Usuario usuarioAEliminar)
            throws UsuarioException {
        if (buscarUsuario(usuarioAEliminar) == null) {
            throw new UsuarioNoEncontradoException(
                    usuarioAEliminar.getUsername());
        } else {
            daoUsuario.eliminar(usuarioAEliminar);
        }
    }

    /**
     * {@inheritDoc}
     */
    public void actualizarUsuario(Usuario usuarioAActualizar)
            throws UsuarioException {
        if (buscarUsuario(usuarioAActualizar) == null) {
            throw new UsuarioNoEncontradoException(
                    usuarioAActualizar.getUsername());
        } else {
            daoUsuario.actualizar(usuarioAActualizar);
        }
    }

    /**
     * {@inheritDoc}
     */
    public ArrayList<Usuario> listarUsuarios() {

        return daoUsuario.listar();
    }

    /**
     * {@inheritDoc}
     */
    public Usuario loginUsuario(Usuario usuarioAIngresar)
            throws UsuarioNoEncontradoException {
        Usuario usuarioLogueado = usuarioAIngresar;
        if (usuarioLogueado != null) {
            return daoUsuario.login(usuarioAIngresar);
        } else {
            throw new UsuarioNoEncontradoException(
                    usuarioAIngresar.getUsername());
        }

    }

    /**
     * {@inheritDoc}
     */

    public Usuario buscarUsuario(Usuario usuarioABuscar)
            throws UsuarioException {
        try {
            daoUsuario.buscar(usuarioABuscar);
        } catch (NoResultException e) {
            LOG.warn("Usuario no encontrado buscaragregado"
                    + usuarioABuscar.getUsername());
        }
        return (daoUsuario.buscar(usuarioABuscar));
    }

    /**
     * {@inheritDoc}
     */
    public Usuario buscarUsuarioAgregado(Usuario usuarioABuscar)
            throws UsuarioException {
        Usuario usuario = null;
        try {
            usuario = daoUsuario.buscar(usuarioABuscar);
        } catch (NoResultException e) {
            LOG.warn("Usuario no encontrado buscar"
                    + usuarioABuscar.getUsername());
        }
        return usuario;
    }
}
